/*
 * Fichier source C++ du projet menulib
 *
 * Cible : PSP
 * Auteur : BuLLeKeUp
 * Date de création : 17/03/2012
 * Date de dernière modification : 17/03/2012
 *
 * Ce projet est sous license GNU GPL v3. Consultez la license associée dans le repertoire doc/gplv3.txt
 * ou rendez vous sur http://www.gnu.org/copyleft/gpl.html
 *
 * Nom du fichier : main.cpp
 *
 * Description : Fichier principal du programme de developpement de la librarie menulib
 * Une classe menu pour tout l'écran (gestion du défilement si possible)
 * Une classe menu_foot pour le pied de l'écran (laisse possibilité via fction printfBody)
 * Une classe menu_head pour le haut de l'écran (idem)
 * Une classe menu_left pour la gauche de l'écran (gestion du défilement si possible)
 *
 */

#include <pspkernel.h>
#include <pspdisplay.h>
#include <pspctrl.h>
#include <stdlib.h>
#include <malloc.h>
#include "include/generic/callbacks.h"
#include "include/generic/defines.h"
#include "include/menu/menu.h"
#include "include/functions/thread_functions.h"
#include "include/ctrlhandler/ctrlHandler.h"

#define PROG_NAME "Test menulib"
#define MAJ 0
#define MIN 1

PSP_MODULE_INFO(PROG_NAME, PSP_MODULE_USER, MAJ, MIN);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
PSP_HEAP_SIZE_MAX();

void printTest(void *arg) {
    pspDebugScreenClear();
    printf("Test d'appel de fonction.");
}

void afficherMenu(void *p_menu) {
    menu *menuafficher = static_cast<menu *>(p_menu);
    menuafficher->printMenu();
}

int main(int argc, char *argv[])
{
    int exit_thread;
    menu *test, *test2;
    titleOptions *title;
    char **options;
    char **options2;
    SceUID threadID;
    fctPtr *functions;
    void **args;
    
    exit_thread = setupCallbackThread();
    
    sceCtrlSetSamplingCycle(0);
    sceCtrlSetSamplingMode(1);
    
    options = (char **) malloc(2);
    options[0] = (char *) malloc(8);
    options[1] = (char *) malloc(8);
    options[0] = "option1";
    options[1] = "option2";
    
    options2 = (char **) malloc(2);
    options2[0] = (char *) malloc(8);
    options2[1] = (char *) malloc(8);
    options2[0] = "option1";
    options2[1] = "option2";
    
    title = new titleOptions[2];
    
    title[0].title = "TITRE 1";
    title[0].nbOptions = 2;
    title[0].options = options;
    title[0].optionColor = ColorRed;
    title[0].titleColor = ColorBlue;
    title[0].titlePos = PosCenter;
    
    title[1].title = "TITRE 2";
    title[1].nbOptions = 2;
    title[1].options = options;
    title[1].optionColor = ColorWhite;
    title[1].titleColor = ColorGreen;
    title[1].titlePos = PosLeft;
    
    functions = (fctPtr*) malloc(sizeof(int) * 3);
    functions[0] = (&printTest);
    
    args = (void **) malloc(sizeof(int)*3);
    
    pspDebugScreenInit();
    sceCtrlSetSamplingCycle(0);
    sceCtrlSetSamplingMode(1);
    
    test = new menu(title, 2, "Test Menu", functions, args);
    test2 = new menu(title, 2, "Test Menu numero 2", functions, args);
    
    functions[1] = &(afficherMenu);
    functions[2] = &(afficherMenu);
    
    args[0] = NULL;
    args[1] = test;
    args[2] = test2;
    
    ctrlStruct *structCtrl = new ctrlStruct;
    structCtrl->classType = MENU;
    structCtrl->classPointer = test;
    ctrlHandler *handler = new ctrlHandler(structCtrl);
    
    threadID = setupCtrlThread();
    launchCtrlThread(threadID, handler);
    
    test->printMenu();
    
    while (1) {
        sceKernelDelayThreadCB(1000000);
    }
    
    //End of the program
    sceKernelExitGame();
    return EXIT_SUCCESS;
}

int receptFromMenu(fctPtr function, void *appelant, void *arg) {
    delete static_cast<menu *>(appelant);
    function(arg);
    return EXIT_SUCCESS;
}
